package com.example.service;

import com.example.model.ColumnInfo;
import com.example.model.TableInfo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 数据库元数据缓存服务
 */
@Component
@Slf4j
public class SchemaMetadataCache {

    /**
     * 内部缓存容器
     */
    private final Map<String, DatabaseMetadata> databaseCache = new ConcurrentHashMap<>();

    /**
     * 获取指定数据库的元数据
     * @param key 缓存键，可以是connectionId或'default'
     * @return 数据库元数据对象
     */
    public DatabaseMetadata getMetadata(String key) {
        return databaseCache.get(key);
    }

    /**
     * 缓存数据库元数据
     * @param key 缓存键，可以是connectionId或'default'
     * @param tables 表信息列表
     * @return 缓存的数据库元数据对象
     */
    public DatabaseMetadata cacheMetadata(String key, List<TableInfo> tables) {
        DatabaseMetadata metadata = new DatabaseMetadata(tables);
        databaseCache.put(key, metadata);
        log.info("缓存元数据成功: key={}, tableCount={}", key, tables.size());
        return metadata;
    }

    /**
     * 移除指定数据库的元数据缓存
     * @param key 缓存键，可以是connectionId或'default'
     */
    public void removeMetadata(String key) {
        databaseCache.remove(key);
        log.info("移除元数据缓存: key={}", key);
    }

    /**
     * 判断是否存在缓存
     * @param key 缓存键，可以是connectionId或'default'
     * @return 是否存在缓存
     */
    public boolean hasCache(String key) {
        return databaseCache.containsKey(key);
    }

    /**
     * 清理所有缓存
     */
    public void clearAll() {
        databaseCache.clear();
        log.info("清理所有元数据缓存");
    }

    /**
     * 数据库元数据内部类
     */
    @Data
    @AllArgsConstructor
    public static class DatabaseMetadata {
        private List<TableInfo> tables;
        private LocalDateTime createdAt;
        private LocalDateTime lastAccessAt;
        private long accessCount;

        public DatabaseMetadata(List<TableInfo> tables) {
            this.tables = tables;
            this.createdAt = LocalDateTime.now();
            this.lastAccessAt = LocalDateTime.now();
            this.accessCount = 0;
        }

        /**
         * 更新访问时间和计数
         */
        public void accessed() {
            this.lastAccessAt = LocalDateTime.now();
            this.accessCount++;
        }

        /**
         * 获取缓存年龄（秒）
         */
        public long getAgeInSeconds() {
            return java.time.Duration.between(createdAt, LocalDateTime.now()).getSeconds();
        }

        /**
         * 判断缓存是否过期（超过1小时）
         */
        public boolean isExpired() {
            return getAgeInSeconds() > 3600;
        }
    }
} 